﻿namespace los17
{
    #region     知识点一   多态的概念
    //多态按字面的意思就是“多种状态”
    //让继承同一父类的子类们 在执行相同的方法时有不同表现（状态）
    //主要目的
    //同一父类的对象 执行相同行为（方法）有不同表现
    //解决的问题
    //让同一个对象有唯一行为的特征
    #endregion

    #region     知识点二   解决的问题
    class Father
    {
        public void SpeakName()
        {
            Console.WriteLine("Father的方法");
        }
    }
    class Son:Father
    {
        public void SpeakName()
        {
            Console.WriteLine("Son的方法");
        }
    }
    #endregion

    #region     知识点三   多态的实现
    //已经学过的多态
    //编译时多态 -- 函数重载，开始就写好的

    //将要学习的：
    //运行时多态（vob 抽象函数 接口）
    //v：virtual（虚函数）
    //o：override（重写）
    //b：base（父类）
    class GameObject
    {
        public string name;
        public GameObject(string name)
        {
            this.name = name;
        }
        /// <summary>
        /// 虚函数   可以被子类重写
        /// </summary>
        public virtual void Atk()
        {
            Console.WriteLine("对象攻击");
        }
    }
    class Player:GameObject
    {
        public Player(string name):base(name)
        {

        }
        //重写虚函数
        public override void Atk()
        {
            //base作用
            //代表父类 可以通过base来保父类的行为
            base.Atk();
            Console.WriteLine("玩家攻击");
        }
    }
    class Monster:GameObject
    {
        public Monster(string name):base(name)
        {

        }
        public override void Atk()
        {
            base.Atk();
            Console.WriteLine("怪物攻击");
        }
    }
    #endregion
    internal class class17
    {
        static void Main(string[] args)
        {
            Console.WriteLine("多态vob");
            #region     解决的问题
            Father f = new Son();
            f.SpeakName();//这里打印的是Father的方法
            (f as Son).SpeakName();//这里打印的是Son的方法

            GameObject p = new Player("Charlie");
            p.Atk();
            GameObject m = new Monster("wawu");
            m.Atk();//与下面作用相同
            (m as Monster).Atk();//与上面作用相同
            #endregion
        }
        //总结:
        //多态：让同一类型的对象执行相同行为时有不同表现
        //解决的问题：让同一对象有唯一的行为特征
        //vob：
        //v:virtual  虚函数
        //o:override  重写
        //b：base  父类
        //v和o一定是结合使用的 来实现多态
        //b是否使用根据实际需求 保留父类行为

    }
}
